Skip to content

[๐Ÿš€ ์‚ฌ์ดํด2 - ๋ฏธ์…˜ (๊ธฐ๋ฌผ ํ™•์žฅ + DB ์ ์šฉ)] ๋ณด์˜ˆ ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.#337

Merged
echo724 merged 22 commits intowoowacourse:boyekimfrom
boyekim:step2
Apr 14, 2026

Conversation

@boyekim
Copy link
Copy Markdown

@boyekim boyekim commented Apr 8, 2026

์ฒดํฌ ๋ฆฌ์ŠคํŠธ

  • ๋ฏธ์…˜์˜ ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ–ˆ๋‚˜์š”?
  • Gradle test๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ†ต๊ณผํ–ˆ๋‚˜์š”?
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋‚˜์š”?

์–ด๋–ค ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•˜์—ฌ ๋ฆฌ๋ทฐํ•ด์•ผ ํ• ๊นŒ์š”

๋ฆฌ๋ทฐ ์š”์ฒญ์ด ๋Šฆ์–ด์ง„ ์  ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค...

DB ์ ์šฉ

DB๋Š” SQLite๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์œ ๋Š” ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑ์‹œํ‚ค๋ ค๋ฉด ํŒŒ์ผ DB์—ฌ์•ผํ•˜๊ณ , H2๋Š” ์ด์ „์— ์˜ˆ์•ฝ์–ด ๋•Œ๋ฌธ์— ๊ท€์ฐฎ์•˜๋˜ ๊ฒฝํ—˜์ด ์žˆ์–ด ๋ฐ˜๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•œ๋ฒˆ๋„ ์•ˆ์จ๋ณธ SQLite๋ฅผ ์‚ฌ์šฉํ•ด๋ดค์Šต๋‹ˆ๋‹ค.
DB์— ์–ด๋–ค ์ •๋ณด๋ฅผ ์ €์žฅํ• ์ง€ ๊ณ ๋ฏผํ•œ ๋์—, ๋ณด๋“œ ์ƒํƒœ ์ „์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ด๋™ ์ •๋ณด๋งŒ ์ €์žฅํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ฒฐ๋ก ์€ ์ด์ „์— ์—์ฝ”๊ฐ€ ๋‚จ๊ฒจ์ฃผ์‹  ์ด๋™ ์ •๋ณด๋งŒ ๋‚จ๊ฒจ๋ณด์•˜์Šต๋‹ˆ๋‹ค! ์ด์œ ๋Š” ์–ด์ฐจํ”ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์žฌ์‹œ์ž‘ ์‹œ Turn ์ •๋ณด๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๋ณด๋“œ ์Šค๋ƒ…์ƒท์„ ์ง์ ‘ ์ €์žฅํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ €์žฅ ๊ตฌ์กฐ๊ฐ€ ๋‹จ์ˆœํ•˜๊ณ , ๊ธฐ์กด doGame / move ํ๋ฆ„์„ ๊ทธ๋Œ€๋กœ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์–ด์š”.

์ด์ „ ์ฝ”๋ฉ˜ํŠธ ์ ์šฉ

Board๋ฅผ ์ธ์ž๋กœ ๋ฐ›์„ ๊ฒฝ์šฐ Board <-> Piece ์–‘๋ฐฉํ–ฅ ์˜์กด์„ฑ์ด ์ƒ๊น๋‹ˆ๋‹ค. Piece์˜ ๋ณ€๊ฒฝ์— Board๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๊ณ , Board ๋ณ€๊ฒฝ์— Piece๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋ฐ์š”, ์ด ๋ถ€๋ถ„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

ํ•ด๋‹น ์ฝ”๋ฉ˜ํŠธ ์ ์šฉ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
AS-IS

  • Piece๊ฐ€ Board๋ฅผ ์ง์ ‘ ๋ฐ›์•„ ์žฅ์• ๋ฌผ์„ ๊ฒ€์ฆํ•œ๋‹ค.
  • ์ด ๊ณผ์ •์—์„œ Board์™€ Piece ์‚ฌ์ด์— ์–‘๋ฐฉํ–ฅ ์˜์กด์„ฑ์ด ์ƒ๊ธด๋‹ค.

TO-BE

  • Board๊ฐ€ ์ด๋™ ๊ฒฝ๋กœ์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•ด DTO(MoveRoute)๋กœ ๋งŒ๋“ ๋‹ค.
  • Piece๋Š” Board ๋Œ€์‹  MoveRoute๋ฅผ ๋ฐ›์•„ ์ด๋™ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค.

์ด ๋ณ€๊ฒฝ์„ ํ†ตํ•ด Piece๊ฐ€ ๋ณด๋“œ ์ „์ฒด ๊ตฌ์กฐ๋ฅผ ์ง์ ‘ ์•Œ ํ•„์š”๊ฐ€ ์—†์–ด์กŒ๊ณ , Board์™€ Piece ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

@echo724 echo724 self-requested a review April 8, 2026 12:59
Copy link
Copy Markdown

@echo724 echo724 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์•ˆ๋…•ํ•˜์„ธ์š” ๋ณด์˜ˆ!
์ €๋„ ๋ฆฌ๋ทฐ๊ฐ€ ๋Šฆ์–ด์ง„ ์  ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค..
์ผ๋‹จ ๊ณต์„ฑ๊ณผ DB ์š”๊ตฌ์‚ฌํ•ญ ๊น”๋”ํ•˜๊ฒŒ ์ž˜ ์ฒ˜๋ฆฌํ•˜์‹  ๊ฒƒ ๊ฐ™์•„์š”! ๊ธฐ์กด ํ„ด์ œ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ์— ๋งž๊ฒŒ ๋””๋น„์—๋„ ์ด๋™ ์ •๋ณด ๊ธฐ๋ฐ˜์œผ๋กœ๋งŒ ์ž˜ ๋‹ด์•„์„œ ํ‘œํ˜„ํ•˜์‹  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํฌ๋ฃจ๋“ค์˜ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ํŠธ๋žœ์ ์…˜์„ ์ด์šฉํ•ด์„œ ํ”ผ์Šค๋“ค์„ ์ „์ฒด ์—…๋ฐ์ดํŠธ ํ•ด์•ผํ•˜๋Š” ๊ตฌ์กฐ์ธ๋ฐ, ํ˜„์žฌ ๋ณด์˜ˆ ์ฝ”๋“œ ๊ธฐ์ค€์œผ๋กœ๋Š” ํŠธ๋žœ์ ์…˜์ด ํ•„์š”ํ•˜์ง€๋„ ์•Š์•„์„œ ์ข‹์€ ์„ค๊ณ„๊ฐ€ ์•„๋‹Œ๊ฐ€ ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค! ์˜คํžˆ๋ ค ๋ณด๋“œ ์ „์ฒด๋ฅผ ๋‹ด์•˜๋‹ค๋ฉด ๊ตณ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ •๋ณด๋“ค๊นŒ์ง€ ์˜์†ํ™”๊ฐ€ ๋˜์–ด ๋””์Šคํฌ์— ๋ถ€๋‹ด์„ ์ฃผ์—ˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฆฌํ”Œ๋ ˆ์ด๊ฐ€ ๋œ๋‹ค๋ฉด ๊ตณ์ด ๋ณด๋“œ์˜ ์Šค๋ƒ…์ƒท์„ ์˜์†ํ™” ํ•  ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ์š”? ๋ฌผ๋ก  ํ„ด์ด ์ˆ˜๋ฐฑํ„ด์ด ๋„˜์–ด๊ฐ„๋‹ค๋ฉด ์Šค๋ƒ…์ƒท์„ ์ค‘๊ฐ„์ค‘๊ฐ„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ๋ชจ๋“  ํ„ด์— ๋ณด๋“œ ์ •๋ณด๋ฅผ ๋‹ด๋Š”๊ฒƒ์€ ์–ด๋ ค์› ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์˜๋ฏœ์—์„œ ์ €๋Š” ํ˜„์žฌ ๊ตฌ์กฐ๊ฐ€ ํ›จ์”ฌ ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด์ „ ์ปค๋ฉ˜ํŠธ๋„ ์ž˜ ๋ฐ˜์˜ํ•ด์ฃผ์‹  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! ๊ตณ์ด ํ”ผ์Šค์—๊ฒŒ ์žˆ์–ด์„œ ๋ณด๋“œ์˜ ๊ตฌํ˜„ ๋‚ด์šฉ์„ ์•Œ ํ•„์š”๋Š” ์—†์œผ๋‹ˆ ์ข‹์€ ๋ฐฉํ–ฅ์œผ๋กœ ์„ค๊ณ„ ํ•ด์ฃผ์‹  ๊ฒƒ ๊ฐ™์•„์š”!

์ด๋ฒˆ ๋ฆฌํ€˜์ŠคํŠธ ์ฒด์ธ์ง€์—์„œ๋Š” 1. Service, Game ๊ฐ์ฒด๋“ค์˜ ๊ฒฐํ•ฉ ๊ณ ๋ฏผ 2. ์„œ๋น„์Šค, ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€๋กœ ํ•ด์ฃผ์…จ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค. 1๋ฒˆ์˜ ๊ฒฝ์šฐ ์ปค๋ฉ˜ํŠธ๋ฅผ ๋‚จ๊ฒผ๊ณ , 2๋ฒˆ์˜ ๊ฒฝ์šฐ์—๋Š” ๋””๋น„์˜ ๊ฒฝ์šฐ์—๋Š” ํŠนํžˆ ๋ฐฐํฌ ํ™˜๊ฒฝ, ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ DB๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ฑฐ๋‚˜ ํ•˜๋Š” ์‹์œผ๋กœ ์™ธ๋ถ€ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. 1. ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ด ์˜์†ํ™” ๊ณ„์ธต๊ณผ ๊ณ„์ธต์„ ํฌํ•จํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์งค ์ˆ˜ ์žˆ์„๊นŒ 2. ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํ”„๋กœ๋•์…˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—†์ด ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์„์ง€์— ๋Œ€ํ•ด์„œ ๊ณ ๋ฏผํ•ด๋ณด์‹œ๊ณ  ์ง์ ‘ ํ…Œ์ŠคํŠธ ์ž‘์„ฑํ•ด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! ํ˜น์‹œ ์• ๋งคํ•œ ๋ถ€๋ถ„์€ ์ปค๋ฉ˜ํŠธ ๋‹ฌ์•„์ฃผ์‹œ๊ฑฐ๋‚˜ DM ์ฃผ์„ธ์š” ํ™”์ดํŒ…์ž…๋‹ˆ๋‹ค!

package janggi.persistence.dto;

public record MoveHistory(
int turnNumber,
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ํ„ด ์ •๋ณด๊ฐ€ ์ €์žฅ์€ ๋˜๋Š”๋ฐ ๋”ฐ๋กœ ์“ฐ์ด๋Š” ๊ณณ์€ ์—†๋Š” ๊ฒƒ ๊ฐ™๋„ค์š”. ํ˜น์‹œ ๋„ฃ์€ ์ด์œ ๊ฐ€ ์žˆ์„๊นŒ์š”?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ํฌํ•จํ•ด๋‘๋ฉด ์œ ์šฉํ•  ๊ฒƒ ๊ฐ™์•„์„œ ์ถ”๊ฐ€ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค!
๊ฐ€์žฅ ์ตœ๊ทผ ํ„ด์„ ๊ฐ€์ ธ์˜จ๋‹ค๊ฑฐ๋‚˜, ๋ช‡ ๋ฒˆ ๋งŒ์— ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋˜์—ˆ๋Š”์ง€ ๋“ฑ ๊ธฐ๋ณธ ๊ฒŒ์ž„ ์ •๋ณด์— ํ•ด๋‹นํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ๋„ฃ์—ˆ์—ˆ๋Š”๋ฐ์š”, ์ฝ”๋“œ ์ƒ์—์„œ๋Š” ์‚ฌ์šฉ์ด ์•ˆ๋˜๋‹ˆ ์ œ๊ฑฐํ•˜๋Š”๊ฒŒ ๋‚˜์„๊นŒ์š”?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์•„๋ฌด๋ž˜๋„ ๋‹น์žฅ ๊ตฌํ˜„์ด ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ๋นผ๋Š” ๊ฒƒ์ด ์ข‹๊ธด ํ•ฉ๋‹ˆ๋‹ค๋งŒ, ๊ตฌํ˜„ ์‹œ์ ์ด ์–ธ์ œ๋ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ๊ฒƒ ๊ฐ™๋„ค์š”. ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ์งง์€ ๊ธฐ๊ฐ„ ๋‚ด์— ๊ตฌํ˜„๋  ์˜ˆ์ •์ด๋ผ๋ฉด ๋„ฃ์–ด๋„ ๋˜๊ฒ ์ง€๋งŒ, ๋ณดํ†ต์˜ ๊ฒฝ์šฐ, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ •๋ณด๋ฅผ ์ €์žฅํ•ด๋„ ๋‚˜์ค‘์— ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ๊ณ , ๋ฆฌํŽ™ํ† ๋ง์„ ํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ํ•ด๋‹น ํ•„๋“œ๊ฐ€ ์‚ฌ์šฉ์ด ๋˜๋Š”์ง€ ์•ˆ๋˜๋Š”์ง€ ์•Œ๊ธฐ ์–ด๋ ค์›Œ ์ง„ํ–‰ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๋Š” ๋ถ€๋ถ„๋„ ์žˆ์Šต๋‹ˆ๋‹ค!

Comment thread src/main/java/janggi/JanggiRunner.java Outdated
Comment on lines 89 to 91
private boolean isCancelCommand(String input) {
return CANCEL.equalsIgnoreCase(input.trim());
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์˜ค ์ทจ์†Œ ์ปค๋ฉ˜๋“œ ์ข‹๋„ค์š”! ์‹ค์ œ ์‹คํ–‰ํ•ด๋ณด๋ฉด์„œ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ ์ž˜ ์ฒ˜๋ฆฌํ•˜์…จ๋„ค์š”!

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋‹ค๋งŒ CANCEL์ด JanggiRunner์— ์žˆ์–ด๋„ ๋˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ๊ณ ๋ฏผํ•ด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. inputView์—์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š”๊ฒŒ ๋งž์ง€ ์•Š์„๊นŒ์š”?

Copy link
Copy Markdown
Author

@boyekim boyekim Apr 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ œ๊ฐ€ ์ •์˜ํ•œ cancel์€

  1. ์ดํ›„ ์ขŒํ‘œ ๊ฒ€์ฆ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ์ทจ์†Œํ•ด์•ผํ•จ
  2. ์žฅ๊ธฐ ๊ฒŒ์ž„ ๊ทœ์น™์ด๋ผ๊ณ  ๋ณด๊ธฐ ์–ด๋ ค์›€
  3. ์ฝ˜์†”๊ณผ ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์ž„

์ด๋Ÿฐ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๊ฒŒ์ž„๊ณผ ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ๋ณด๋‹ค๋Š” ๊ทธ ์ด์ „๋‹จ๊ณ„์ธ ์ฝ˜์†”๊ณผ์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ Runner์— ์œ„์น˜์‹œ์ผฐ์—ˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ฒŒ์ž„๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ˆ ์•„์˜ˆ InputView๊ฐ€ ์ฒ˜๋ฆฌํ•ด์ค˜๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋„ค์š”. ์˜คํžˆ๋ ค Runner๊ฐ€ ๋ชฐ๋ผ๋„ ๋˜๋Š” ์ž…๋ ฅ ๊ทœ์น™์„ ์•Œ๊ณ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์š”.
inputView์— readCancelableLine๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜๋ณด์•˜์Šต๋‹ˆ๋‹ค.
์–ด๋•Œ๋ณด์ด๋‚˜์š”?!

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ผ๋‹จ InputView๋กœ ๋กœ์ง ์˜ฎ๊ธฐ์‹  ๋ถ€๋ถ„์€ ์ž˜ ํ•˜์‹  ๊ฒƒ ๊ฐ™๋„ค์š”! ๋‹ค๋งŒ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์€ ์ปค๋ฉ˜ํŠธ๋กœ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค!

Comment thread src/main/java/janggi/JanggiRunner.java Outdated
Comment on lines +47 to +50
private void play(JanggiGame janggiGame, Position startPosition, Optional<Position> endPosition) {
janggiGame.doGame(startPosition, endPosition.get());
janggiService.saveMove(janggiGame, startPosition, endPosition.get());
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์žฅ๊ธฐ ๊ฒŒ์ž„๊ณผ ์žฅ๊ธฐ ์„œ๋น„์Šค ๋ผ์ดํ”„ ์‚ฌ์ดํด์ด ๋น„์Šทํ•˜๊ธฐ๋„ ํ•˜๊ณ , ์‚ฌ์‹ค janggiGame์ด Repository๋ฅผ ํ•„๋“œ๋กœ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉด Service๊ฐ€ ๋”ฑํžˆ ํ•„์š”ํ•ด๋ณด์ด์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์€๋ฐ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”? ๊ฒŒ์ž„์ด ๊ฒŒ์ž„ ์‹คํ–‰ + ์ €์žฅ์„ ๋งก์•„์„œ ํ•˜๋Š” ์…ˆ์ธ๊ฑฐ์ฃ 

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ํ•ด๋‹น ๊ตฌ์กฐ์˜ ์žฅ์ ์€ ๊ฒŒ์ž„์„ ์‹คํ–‰ํ•œ ๋‹ค์Œ ์ €์žฅํ•˜๋Š” ๊ฐ„๊ทน์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์žฅ๊ธฐ๋ง์€ ์ธ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ์›€์ง์—ฌ์กŒ๋Š”๋ฐ ๋ชจ์ข…์˜ ์ด์œ ๋กœ Service ์ชฝ์—์„œ ์ €์žฅ์ด ์•ˆ๋  ๊ฒฝ์šฐ๋„ ์žˆ์ž–์•„์š”? ๊ทธ๋Ÿฌ๋ฉด ์ธ๋ฉ”๋ชจ๋ฆฌ์™€ ์˜์† ์ƒํƒœ๋ฅผ ์–ด๋–ป๊ฒŒ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์„๊นŒ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ๋„ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Copy link
Copy Markdown
Author

@boyekim boyekim Apr 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์˜์†์— ๋Œ€ํ•œ ์ฑ…์ž„์€ ๊ธฐ์กด ๊ฒŒ์ž„ ์‹คํ–‰๊ณผ ์‹œ์ ์ด ๋ถ„๋ฆฌ๋˜์–ด์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ, ๊ฒŒ์ž„ ์‹คํ–‰ + ์ €์žฅ์„ ๋ถ„๋ฆฌํ•ด์ฃผ๋ ค ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ฐ„๊ทน์„ ์ค„์ด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•  ๊ฒƒ ๊ฐ™์•„์„œ ์ƒ๊ฐ์„ ์ „๊ฐœํ•ด๋ณด์•˜๋Š”๋ฐ์š”,
Service์—์„œ ๊ฒŒ์ž„ ์‹คํ–‰๊ณผ ์ €์žฅ์„ ๋“ค๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”?
Input,Output์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ Runner๊ฐ€ ํ•˜๊ณ , ๊ฒŒ์ž„ ์ง„ํ–‰ ๋ฐ ์ €์žฅ์„ Service๊ฐ€ ํ•ด์ค€๋‹ค๋ฉด ๊ฐ„๊ทน์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ  ์—ญํ• ๋„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
e95429f ํ•ด๋‹น ์ปค๋ฐ‹์—์„œ ๋ฐ˜์˜ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค!

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ข‹์Šต๋‹ˆ๋‹ค! ํ•ด๋‹น ๋ถ€๋ถ„ ์ปค๋ฉ˜ํŠธ ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค~

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

class JanggiGameTest {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ํ˜„์žฌ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” ๋ณด์ด์ง€ ์•Š๋„ค์š”? DB์— ๋Œ€ํ•œ ์˜์กด์„ฑ๋งŒ ํ•ด๊ฒฐํ•ด์ฃผ๋ฉด ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์€๋ฐ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

Copy link
Copy Markdown
Author

@boyekim boyekim Apr 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fake๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ ๋‘๊ฐ€์ง€์—์„œ ๊ณ ๋ฏผํ–ˆ์—ˆ๋Š”๋ฐ์š”,

  1. test์šฉ ํŒŒ์ผ db๋ฅผ ํŒ๋‹ค.
  2. fake ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.

ํ•˜์ง€๋งŒ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ๋น„์šฉ, ๊ทธ๋ฆฌ๊ณ  Service ๋กœ์ง๋งŒ์ด ์‹คํŒจ ์›์ธ์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ๊ฒŒ ๋  ๊ฒƒ ๊ฐ™์•„์„œ....์šฐ์„  2๋ฒˆ์„ ํƒํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

Comment on lines +78 to +80
} catch (SQLException e) {
throw new IllegalStateException("์ˆ˜ ์ €์žฅ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.", e);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ˆ˜ ์ €์žฅ ์‹คํŒจ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ์—†๊ณ  ์˜ˆ์™ธ๊ฐ€ ํ„ฐ์ง€๋ฉด ์ข…๋ฃŒ๋˜๋Š” ๊ตฌ์กฐ๋„ค์š”. ํ•ญ์ƒ ๋””๋น„ ๊ด€๋ จ์€ ์ƒํƒœ ๋ถˆ์ผ์น˜์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”๋ฐ ๊ฒŒ์ž„์„ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ ๋Œ€์‹  ํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ์‚ฌํ•ญ์ด ์—†์„๊นŒ์š”? ์žฌ์‹œ๋„๋ฅผ ํ•œ๋‹ค๋˜์ง€ ํ•˜๋Š”์‹์œผ๋กœ์š”. ๊ทธ๋ฆฌ๊ณ  executeUpdate ์ฃผ์„์—๋Š” SQLTimeoutException์ด ๋˜์ ธ์ง„๋‹ค๊ณ ๋„ ํ•˜๋Š”๋ฐ ํƒ€์ž„ ์•„์›ƒ์— ๋Œ€ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋„ ํ•„์š”ํ•˜์ง€ ์•Š์„๊นŒ์š”? ํ˜„์—…์—์„œ๋Š” ํŠนํžˆ ํƒ€์ž„์•„์›ƒ ๊ด€๋ จ ์˜ˆ์™ธ๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ ์ด ๋ถ€๋ถ„๋„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ๋˜ ์ƒํƒœ ๋ถˆ์ผ์น˜๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Copy link
Copy Markdown
Author

@boyekim boyekim Apr 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

timeout ๋กœ์ง์€ ์šฐ์„  save, update(๊ฒŒ์ž„ ์ข…๋ฃŒ์‹œ ์ƒํƒœ ๋ณ€๊ฒฝ)์—์„œ 3๋ฒˆ๊นŒ์ง€ ์žฌ์‹œ๋„ํ•˜๋„๋ก ์ถ”๊ฐ€ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
์ƒํƒœ ๋ถˆ์ผ์น˜์— ๋Œ€ํ•ด์„œ๋„ ๊ณ ๋ฏผํ•ด๋ณด์•˜๋Š”๋ฐ, ์•„์ง์€ ์–ด๋–ค ๋ฐฉ์‹์ด ๊ฐ€์žฅ ์ ์ ˆํ•œ์ง€ ํ™•์‹ ์ด ์—†์Šต๋‹ˆ๋‹ค. ํŠนํžˆ timeout ์ƒํ™ฉ์—์„œ๋Š” ์‹ค์ œ๋กœ ์ €์žฅ์ด ์‹คํŒจํ•œ ๊ฒƒ์ธ์ง€, ์ €์žฅ์€ ๋˜์—ˆ์ง€๋งŒ ์‘๋‹ต๋งŒ ๋Šฆ์€ ๊ฒƒ์ธ์ง€ ํŒ๋‹จํ•˜๊ธฐ ์–ด๋ ค์›Œ์„œ ๋‹จ์ˆœ ์žฌ์‹œ๋„๋งŒ์œผ๋กœ๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.
์ด ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ™์€ ์ด๋™์„ ๋‹ค์‹œ ์ž…๋ ฅํ•˜๋„๋ก ์œ ๋„ํ•˜๋Š” ๋ฐฉ์‹๋„ ์ƒ๊ฐํ•ด๋ณด์•˜์ง€๋งŒ, ๊ฐ™์€ ์ƒํ˜ธ์ž‘์šฉ์„ ๋‹ค์‹œ ๋ฐ›๋Š” ๊ฒƒ์ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด๋‚˜ ์ƒํƒœ ์ผ๊ด€์„ฑ ์ธก๋ฉด์—์„œ ์ ์ ˆํ•œ์ง€๋Š” ์กฐ๊ธˆ ๋” ๊ณ ๋ฏผ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
์–ด๋–ค์‹์œผ๋กœ ๋” ๊ฐœ์„ ํ•˜๋ฉด ์ข‹์„์ง€ ์—ฌ์ญค๋ณด๊ณ ์‹ถ์Šต๋‹ˆ๋‹ค.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์•— ์ด ์ปค๋ฉ˜ํŠธ๋ฅผ ๋‚˜์ค‘์— ์ฝ์—ˆ๋„ค์š”. ์ผ๋‹จ ํƒ€์ž„์•„์›ƒ์˜ ๊ฒฝ์šฐ, ์ •๋ง ์˜ˆ์™ธ์ƒํ™ฉ์„ ์ œ์™ธ ํ•˜๊ณ ๋Š” (์„œ๋น„์Šค ๋ฆฌ์ „์ด ๋‹ค๋ฅธ ๋‚˜๋ผ์— ์žˆ๋‹ค๋˜๊ฐ€, ๋„คํŠธ์›Œํฌ ์‹ ํ˜ธ๊ฐ€ ์•ˆ์ข‹๋‹ค๋˜๊ฐ€) ๋Œ€๋ถ€๋ถ„ ๋ฐ›๋Š”์ชฝ ๋Œ€๊ธฐ ํ์—์„œ ๊ธฐ๋‹ค๋ฆฌ๋‹ค๊ฐ€ ํƒ€์ž„ ์•„์›ƒ์ด ๋‚ฌ์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. ๋ณดํ†ต ๊ฐ™์€ ๋ฆฌ์ „์—์„œ DB๋ž‘ ์„œ๋ฒ„๋ฅผ ์šด์˜ํ•˜๋‹ˆ ์ˆ˜์‹ญ ๋ฐ€๋ฆฌ์„ธ์ปจ๋“œ๋„ ์•ˆ ๋„˜์–ด๊ฐˆ ๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋Š” ๋ฆฌํŠธ๋ผ์ด๋ฅผ ์ข…์ข… ํ•ด์ฃผ๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ๋Œ€์‹  ๋‹ค๋ฅธ ์ปค๋ฉ˜ํŠธ์— ๋‚จ๊ธฐ๊ธด ํ–ˆ๋Š”๋ฐ ์—ฐ์‡„ ํšจ๊ณผ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์กฐ์‹ฌํ•ด์„œ ์„ค์ •ํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํƒ€์ž„์•„์›ƒ์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ์ฝ”๋“œ๋Œ€๋กœ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! ์˜ˆ์™ธ๊ฐ€ ์–ธ์ œ ๋ฐœ์ƒํ• ์ง€ ๊ณ ๋ฏผํ•ด๋ณด์…จ์œผ๋ฉด ํ•ด์„œ ์ปค๋ฉ˜ํŠธ ๋‹ฌ์•˜๋Š”๋ฐ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ƒํƒœ๊ฐ€ ์ž˜๋ชป ๋œ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ์„œ ๋”์ด์ƒ ์œ ์ €์—๊ฒŒ ์ž˜๋ชป๋œ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒ์‹œํ‚ค๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ• ์ผ ๊ฒƒ ๊ฐ™์•„์š”. ๋ฌผ๋ก  ์œ ์ €๊ฐ€ ๋‹ค์ค‘ ์‚ฌ์šฉ์ž์ผ๋•Œ๋Š” ๋˜ ์˜ˆ์™ธ ํ•˜๋‚˜๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒ์‹œ์ผœ๋„ ์•ˆ๋˜์ง€๋งŒ์š”. ์ด๋Ÿฐ ๋ถ€๋ถ„๋“ค ๊ณ ๋ฏผํ•ด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

Comment thread src/main/java/janggi/JanggiRunner.java Outdated
Comment on lines +57 to +59
janggiGame.findWinner()
.orElseThrow(() -> new IllegalStateException("์Šน์ž๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.")),
winnerScore
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ด ๋ถ€๋ถ„ ์•ฝ๊ฐ„ ์–ด์ƒ‰ํ•œ๋ฐ, winnerScore๋Š” ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ Winner๋ฅผ ๋ชป์ฐพ์•„์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‚˜์š”? ์–ด์ฐจํ”ผ Turn์—๊ฒŒ์„œ ์Šน์ž ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ด๋ผ๋ฉด ๋ฌถ์–ด์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š”๋ฐฉ๋ฒ•์ด ์žˆ์ง€ ์•Š์„๊นŒ์š”?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dto๋กœ Turn์—์„œ ๋ฌถ์–ด์„œ ๊ฐ€์ ธ์˜ค๋„๋ก ๋ฐ˜์˜ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค~~!!

@echo724 echo724 self-requested a review April 14, 2026 07:34
Copy link
Copy Markdown

@echo724 echo724 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์•ˆ๋…•ํ•˜์„ธ์š” ๋ณด์˜ˆ!
์ด๋ฒˆ ๋ฏธ์…˜ ๊ณ ์ƒ ๋งŽ์œผ์…จ์Šต๋‹ˆ๋‹ค! ํ™•์‹คํžˆ ์‚ฌ์ดํด 2๋Š” ๊ณต์„ฑ + ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ผ ์‰ฝ์ง€ ์•Š๋‹ค๋Š” ๋А๋‚Œ์ด ๋“ค์—ˆ๋Š”๋ฐ ๊ทธ๋ž˜๋„ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜ ์ž˜ ํ•ด์ฃผ์…จ๋„ค์š”! ๊ธฐ๊ฐ„์ด ์ง€๋‚˜ ๋จธ์ง€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค๋งŒ ์ปค๋ฉ˜ํŠธ ๊ผญ ํ™•์ธํ•ด๋ณด์‹œ๊ณ  ๋‹ค์Œ ๋ฏธ์…˜์—์„œ ๋ชป์ฑ™๊ธด ๋ถ€๋ถ„๋“ค ๋ฐ˜์˜ํ•ด๋ณด์‹œ๊ฑฐ๋‚˜ ํ•™์Šตํ•ด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”! ํŠนํžˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ชฝ์€ ์•ž์œผ๋กœ๋„ ๊ณ„์† ๋‚˜์˜ค๋‹ˆ ์šฐํ…Œ์ฝ” ํ•˜์‹œ๋ฉด์„œ ๊ธฐ๋ณธ๊ธฐ ์ž˜ ์žก์œผ์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

์•ž์œผ๋กœ ๋ฏธ์…˜๋„ ํ™”์ดํŒ…์ž…๋‹ˆ๋‹ค~

outputView.printAskMovePosition(janggiGame.findPiece(startPosition).nickname());
String rawMovePosition = inputView.readLine();
List<String> parsedMovePosition = DelimiterParser.parse(rawMovePosition);
Optional<String> rawMovePosition = inputView.readCancelableLine();
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Empty(None) -> cancel, String -> move ์ด๋Ÿฐ์‹์œผ๋กœ ๊ตฌ๋ถ„์„ ํ•˜์…จ๊ตฐ์š”? ๊ดœ์ฐฎ๊ธด ํ•œ๋ฐ, ์ด๊ฒŒ ํ˜ธ์ถœ์ž ์ž…์žฅ์—์„œ๋Š” Optional์ด ๊ธฐ์กด ์˜๋ฏธ๋ž‘ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉ๋ฌ๋‹ค๋Š”๊ฑธ ์•Œ์•„์•ผํ•˜๊ณ , ์ด ๋ถ€๋ถ„ ์˜๋ฏธ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ๋ฐฉ์‹์„ ์•Œ์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๊ธฐ ์ข‹์€ ์ฝ”๋“œ๋Š” ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ฝ”๋“œ๋ฅผ ์ฝ์—ˆ์„๋•Œ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ๊ฒฝ ์ง€์‹์ด ํ•„์š” ์—†๊ณ , ๊ตฌํ˜„์ฒด๋ฅผ ๋ณผ ํ•„์š”๊ฐ€ ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ์ž˜ ๊ตฌํ˜„๋œ ์ฝ”๋“œ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฑฐ๋“ ์š”. ๋ฌผ๋ก  ๋‹ค๋ฅด๊ฒŒ ์ƒ๊ฐํ•˜์‹ค ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Ÿฐ ๊ธฐ์ค€๋„ ์žˆ๋‹ค ๋ง์”€๋“œ๋ฆฌ๋Š” ๊ฒ๋‹ˆ๋‹ค!

statement.executeUpdate();
} catch (SQLTimeoutException e) {
throw new PersistenceTimeoutException("ํƒ€์ž„์•„์›ƒ์ž…๋‹ˆ๋‹ค. ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.", e);
} catch (SQLException e) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ํƒ€์ž„์•„์›ƒ ์ฒ˜๋ฆฌ ๊ตฟ๊ตฟ!

}

private static <T> T retryOnTimeout(Supplier<T> supplier, Runnable onTimeout, int retryCount) {
try {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ด๋ฏธ ์•„์‹ค ์ˆ˜ ๋„ ์žˆ๊ณ , ์ด ๋ถ€๋ถ„์ด๋ž‘์€ ํฌ๊ฒŒ ๊ด€๋ จ์ด ์—†์„ ์ˆ˜ ๋„ ์žˆ๋Š”๋ฐ Retry๋ผ ์ƒ๊ฐ๋‚˜์„œ ์ ์Šต๋‹ˆ๋‹ค~ ์•Œ๊ณ ๊ณ„์…จ๋‹ค๋ฉด ๋ฌด์‹œํ•ด์ฃผ์„ธ์š”. Retry๋„ ์ฃผ์˜ํ•ด์„œ ์„ค์ •ํ•ด์•ผํ•˜๋Š”๋ฐ ์—ฐ์‡„ ํšจ๊ณผ๋กœ ์ธํ•ด ๋ถ€ํ•˜๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋งŒ์•ฝ ํด๋ฆฌ์•„์–ธํŠธ๋‚˜ ๋‹ค์šด์ŠคํŠธ๋ฆผ(์šฐ๋ฆฌ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค)์—์„œ retry ๋กœ์ง์ด ์žˆ๊ณ  ์šฐ๋ฆฌ์ชฝ์—์„œ๋„ db์— retry๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•  ๊ฒฝ์šฐ, ๊ฐ๊ฐ 3๋ฒˆ์”ฉ ๋ฆฌํŠธ๋ผ์ด๋ฅผ ํ•œ๋‹ค๊ณ  ํ–ˆ์„๋•Œ, 1๋ฒˆ์˜ ํด๋ผ์ด์–ธํŠธ ์ฝœ์ด ์ด 27๋ฒˆ๊นŒ์ง€๋„ db์— ์š”์ฒญ์„ ์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•˜์…”์•ผํ•ด์š”. ํŠนํžˆ DB์˜ ๊ฒฝ์šฐ, ๊ณผ๋„ํ•œ ์š”์ฒญ์œผ๋กœ ์‘๋‹ต์‹œ๊ฐ„์ด ๋А๋ ค์กŒ์„๋•Œ, ์ด๋Ÿฐ ํ˜„์ƒ์ด ์ข…์ข… ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

Comment on lines +45 to +48
PersistenceExecutor.retryOnTimeout(
() -> janggiService.play(janggiGame, startPosition, endPosition.get()),
this::printPersistenceTimeoutMessage
);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์‚ด์ง ์•„์‰ฌ์šธ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์€ ์‚ฌ์‹ค Runner์˜ ์ž…์žฅ์—์„œ Timeout์— ๋Œ€ํ•œ retry๋กœ์ง์€ ๊ด€์‹ฌ์‚ฌ๋‚˜ ์ฑ…์ž„์ด ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค Repository๋‚˜ DAO์˜ ์—ญํ• ์— ์ข€ ๋” ๊ฐ€๊นŒ์šด๋ฐ, print ๋•Œ๋ฌธ์— ์ด ๋ถ€๋ถ„์—์„œ ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ  ํ•˜์‹  ๊ฒƒ ๊ฐ™์•„์š”. ํƒ€์ž„์•„์›ƒ๊ณผ ๋ฆฌํŠธ๋ผ์ด ๋ฉ”์„ธ์ง€๋ฅผ ๊ตณ์ด ์œ ์ €์—๊ฒŒ ๋ณด์—ฌ์ค„ ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ์š”? ๋กœ๊ทธ๋กœ ๋‚จ๊ธฐ๋ฉด ์•ˆ๋˜๋‚˜์š”? ๋งŒ์•ฝ ๋ณด์—ฌ์ค˜์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํ˜„์žฌ ๊ตฌ์กฐ๊ฐ€ ๋งž์„ ๊ฒƒ ๊ฐ™๊ธด ํ•ฉ๋‹ˆ๋‹ค๋งŒ ํ™•์‹คํžˆ ์ข€ ์ฝ”๋“œ๊ฐ€ ์ฝ์ด ์–ด๋ ค์›Œ์ง€๋Š” ๋ถ€๋ถ„์€ ์žˆ์Šต๋‹ˆ๋‹ค!

janggiGame.makeCurrentTurnBoardSnapShot(),
winnerResult.winner(),
winnerResult.winnerScore()
);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๊ตฌ์›ƒ ํ”ผ๋“œ๋ฐฑ ์ž˜ ๋ฐ˜์˜ํ•ด์ฃผ์…จ๋„ค์š”!

Comment on lines +78 to +80
} catch (SQLException e) {
throw new IllegalStateException("์ˆ˜ ์ €์žฅ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.", e);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์•— ์ด ์ปค๋ฉ˜ํŠธ๋ฅผ ๋‚˜์ค‘์— ์ฝ์—ˆ๋„ค์š”. ์ผ๋‹จ ํƒ€์ž„์•„์›ƒ์˜ ๊ฒฝ์šฐ, ์ •๋ง ์˜ˆ์™ธ์ƒํ™ฉ์„ ์ œ์™ธ ํ•˜๊ณ ๋Š” (์„œ๋น„์Šค ๋ฆฌ์ „์ด ๋‹ค๋ฅธ ๋‚˜๋ผ์— ์žˆ๋‹ค๋˜๊ฐ€, ๋„คํŠธ์›Œํฌ ์‹ ํ˜ธ๊ฐ€ ์•ˆ์ข‹๋‹ค๋˜๊ฐ€) ๋Œ€๋ถ€๋ถ„ ๋ฐ›๋Š”์ชฝ ๋Œ€๊ธฐ ํ์—์„œ ๊ธฐ๋‹ค๋ฆฌ๋‹ค๊ฐ€ ํƒ€์ž„ ์•„์›ƒ์ด ๋‚ฌ์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. ๋ณดํ†ต ๊ฐ™์€ ๋ฆฌ์ „์—์„œ DB๋ž‘ ์„œ๋ฒ„๋ฅผ ์šด์˜ํ•˜๋‹ˆ ์ˆ˜์‹ญ ๋ฐ€๋ฆฌ์„ธ์ปจ๋“œ๋„ ์•ˆ ๋„˜์–ด๊ฐˆ ๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋Š” ๋ฆฌํŠธ๋ผ์ด๋ฅผ ์ข…์ข… ํ•ด์ฃผ๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ๋Œ€์‹  ๋‹ค๋ฅธ ์ปค๋ฉ˜ํŠธ์— ๋‚จ๊ธฐ๊ธด ํ–ˆ๋Š”๋ฐ ์—ฐ์‡„ ํšจ๊ณผ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์กฐ์‹ฌํ•ด์„œ ์„ค์ •ํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํƒ€์ž„์•„์›ƒ์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ์ฝ”๋“œ๋Œ€๋กœ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! ์˜ˆ์™ธ๊ฐ€ ์–ธ์ œ ๋ฐœ์ƒํ• ์ง€ ๊ณ ๋ฏผํ•ด๋ณด์…จ์œผ๋ฉด ํ•ด์„œ ์ปค๋ฉ˜ํŠธ ๋‹ฌ์•˜๋Š”๋ฐ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ƒํƒœ๊ฐ€ ์ž˜๋ชป ๋œ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ์„œ ๋”์ด์ƒ ์œ ์ €์—๊ฒŒ ์ž˜๋ชป๋œ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒ์‹œํ‚ค๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ• ์ผ ๊ฒƒ ๊ฐ™์•„์š”. ๋ฌผ๋ก  ์œ ์ €๊ฐ€ ๋‹ค์ค‘ ์‚ฌ์šฉ์ž์ผ๋•Œ๋Š” ๋˜ ์˜ˆ์™ธ ํ•˜๋‚˜๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒ์‹œ์ผœ๋„ ์•ˆ๋˜์ง€๋งŒ์š”. ์ด๋Ÿฐ ๋ถ€๋ถ„๋“ค ๊ณ ๋ฏผํ•ด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

Comment thread src/main/java/janggi/JanggiRunner.java Outdated
Comment on lines +47 to +50
private void play(JanggiGame janggiGame, Position startPosition, Optional<Position> endPosition) {
janggiGame.doGame(startPosition, endPosition.get());
janggiService.saveMove(janggiGame, startPosition, endPosition.get());
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ข‹์Šต๋‹ˆ๋‹ค! ํ•ด๋‹น ๋ถ€๋ถ„ ์ปค๋ฉ˜ํŠธ ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค~

Comment thread src/main/java/janggi/JanggiRunner.java Outdated
Comment on lines 89 to 91
private boolean isCancelCommand(String input) {
return CANCEL.equalsIgnoreCase(input.trim());
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ผ๋‹จ InputView๋กœ ๋กœ์ง ์˜ฎ๊ธฐ์‹  ๋ถ€๋ถ„์€ ์ž˜ ํ•˜์‹  ๊ฒƒ ๊ฐ™๋„ค์š”! ๋‹ค๋งŒ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์€ ์ปค๋ฉ˜ํŠธ๋กœ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค!

package janggi.persistence.dto;

public record MoveHistory(
int turnNumber,
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์•„๋ฌด๋ž˜๋„ ๋‹น์žฅ ๊ตฌํ˜„์ด ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ๋นผ๋Š” ๊ฒƒ์ด ์ข‹๊ธด ํ•ฉ๋‹ˆ๋‹ค๋งŒ, ๊ตฌํ˜„ ์‹œ์ ์ด ์–ธ์ œ๋ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ๊ฒƒ ๊ฐ™๋„ค์š”. ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ์งง์€ ๊ธฐ๊ฐ„ ๋‚ด์— ๊ตฌํ˜„๋  ์˜ˆ์ •์ด๋ผ๋ฉด ๋„ฃ์–ด๋„ ๋˜๊ฒ ์ง€๋งŒ, ๋ณดํ†ต์˜ ๊ฒฝ์šฐ, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ •๋ณด๋ฅผ ์ €์žฅํ•ด๋„ ๋‚˜์ค‘์— ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ๊ณ , ๋ฆฌํŽ™ํ† ๋ง์„ ํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ํ•ด๋‹น ํ•„๋“œ๊ฐ€ ์‚ฌ์šฉ์ด ๋˜๋Š”์ง€ ์•ˆ๋˜๋Š”์ง€ ์•Œ๊ธฐ ์–ด๋ ค์›Œ ์ง„ํ–‰ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๋Š” ๋ถ€๋ถ„๋„ ์žˆ์Šต๋‹ˆ๋‹ค!

@echo724 echo724 merged commit 4db3e33 into woowacourse:boyekim Apr 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants